package com.pay.notify;

import java.util.concurrent.TimeUnit;

import com.pay.constant.Constant;
import com.pay.entity.Merchant;
import com.pay.entity.Order;
import com.pay.resource.SpringBeanResource;
import com.pay.utils.MD5Util;

import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONObject;

/**
 * 支付回调处理类
 * @author Administrator
 *
 */
public class ZfbNotifyHandler implements Runnable{
	
	private Order order ; 
	
	public Order getOrder() {
		return order;
	}

	public void setOrder(Order order) {
		this.order = order;
	}

	@Override
	public void run() {
		if(order == null) {
			return ;
		}
		if(order.getPaystatus() != Constant.pay_success) {
			return ; 
		}
		
		/**
		 * 三次回调机制
		 * 第一次直接回调
		 * 第二次等待30秒
		 * 第三次等到2分钟
		 */
		int count = 0 ; 
		while(true) {
			try {
				count ++ ;
				switch(count) {
					 case 2:{
						 TimeUnit.SECONDS.sleep(30); //30秒 
						 break ;
					 }
					 case 3:{
						 TimeUnit.MINUTES.sleep(2);  //2分钟
						 break ;
					 }
				}
				order.setNotifycount(order.getNotifycount() + 1);
				SpringBeanResource.orderService.updateById(order) ; //更新订单
				
				/**
				 * String str= orderno + paystatus+ amount+ platno+ successtime; 
				String sign= MD5(MD5(str) + key);
				 */
				JSONObject param = new JSONObject();
				param.put("orderno", order.getOrderno()) ; //商户订单号
				param.put("platno", order.getPlatno()) ; //平台订单号
				param.put("paystatus", order.getPaystatus()) ; //除了1其他都是失败
				param.put("amount", order.getAmount()) ; //金额单位分
				param.put("successtime", order.getSuccesstime().getTime()) ; //支付时间
				Merchant merchant = SpringBeanResource.merchantService.getById(order.getMerchantId());
				
				String str = order.getOrderno() + order.getPaystatus() + order.getAmount() + order.getPlatno() + order.getSuccesstime().getTime() ;
				String sign = MD5Util.md5Hex(MD5Util.md5Hex(str) + merchant.getMerchantKey());
				param.put("sign", sign) ; //和提交订单一致的签名
				System.out.println("回调签名：" + sign);
				
				String result = HttpUtil.post(order.getNotify(), param.toString());
				System.out.println("回应给我的内容是：" + result);
				
				if("success".equalsIgnoreCase(result)) {
					//成功
					order.setNotifystatus(Constant.notify_success);  //回调成功
					SpringBeanResource.orderService.updateById(order) ; 
					break ; 
				}
			}catch(Exception e) {
				e.printStackTrace();
			}finally {
				if(count >= 3) {
					//回调已经3次了可以退出了
					break ; 
				}
			}
		}
		
	}

}
